// 导入Redux Toolkit的核心功能
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
// 导入自定义的API请求工具
import request from '../api/request';

/**
 * 获取医生详情的异步action
 * 
 * 功能：根据医生ID从服务器获取该医生的详细信息
 * 
 * 处理逻辑：
 * 1. 发送GET请求到/doctor/detail接口
 * 2. 解析API返回的数组数据
 * 3. 根据doctorId或id字段匹配医生
 * 4. 返回匹配的医生详情数据
 * 
 * @param {string} doctorId - 医生ID
 * @returns {Promise<Object>} 返回医生详情对象
 * @throws {Error} 当API未返回数据或未找到匹配医生时抛出错误
 */
export const fetchDoctorDetail = createAsyncThunk(
  'doctorDetail/fetchDoctorDetail',
  async (doctorId: string) => {
    try {
      const response = await request.get('/doctor/detail', {
        params: { id: doctorId }
      });
      
      if (response.data && response.data.data && Array.isArray(response.data.data) && response.data.data.length > 0) {
        // API返回的是数组，取第一个匹配的医生
        const doctorDetail = response.data.data.find((doctor: { doctorid?: string | number; id?: string | number }) => 
          doctor.doctorid == doctorId || doctor.id == doctorId
        );
        
        if (doctorDetail) {
          return doctorDetail;
        } else {
          throw new Error('未找到医生详情');
        }
      } else {
        throw new Error('API未返回医生数据');
      }
    } catch (error) {
      throw error;
    }
  }
);

/**
 * 医生详情接口定义
 * 
 * 用于描述医生详情对象的结构，包含基础信息和API返回的扩展字段
 */
interface DoctorDetail {
  // 基础信息字段
  id: string; // 医生ID
  name: string; // 医生姓名
  title: string; // 医生职称
  hospital: string; // 所属医院
  department: string; // 科室
  avatar: string; // 头像URL
  isOnline: boolean; // 是否在线
  consultationMethods: string[]; // 咨询方式
  specialties: string; // 专业特长
  rating: number; // 评分
  commendations: number; // 推荐数
  views: number; // 浏览量
  price: number; // 咨询价格
  isGradeA?: boolean; // 是否三甲医院
  
  // 扩展信息字段
  city?: string; // 城市
  hospitalLevel?: string; // 医院等级
  hospitalType?: string; // 医院类型
  hospitalId?: string; // 医院ID
  doctorIdDoc?: string; // 医生文档ID
  doctorTime?: string; // 医生工作时间
  socoDesc?: string; // 社交描述
  socoCity?: string; // 社交城市
  socoImage?: string; // 社交图片
  
  // API返回的字段（兼容不同接口）
  doctorid?: string; // API返回的医生ID
  doctorname?: string; // API返回的医生姓名
  doctordescword?: string; // API返回的医生描述
  doctorName?: string; // API返回的医生姓名（另一种格式）
  description?: string; // 描述
  expertise?: string; // 专业特长
  introduction?: string; // 介绍
}

/**
 * 医生详情状态接口定义
 * 
 * 用于描述医生详情相关状态的结构
 */
interface DoctorDetailState {
  currentDoctor: DoctorDetail | null; // 当前查看的医生详情
  loading: boolean; // 加载状态
  error: string | null; // 错误信息
}

/**
 * 初始状态定义
 * 
 * 设置医生详情相关状态的初始值
 */
const initialState: DoctorDetailState = {
  currentDoctor: null, // null：当前查看的医生详情
  loading: false, // false：加载状态
  error: null, // null：错误信息
};

/**
 * 医生详情Slice配置
 * 
 * 管理医生详情相关的状态和操作
 */
const doctorDetailSlice = createSlice({
  name: 'doctorDetail', // slice名称
  initialState, // 初始状态
  reducers: {
    /**
     * 设置当前医生详情
     * 
     * 功能：设置当前正在查看的医生详细信息
     * 
     * @param {DoctorDetailState} state - 当前状态
     * @param {Object} action - action对象
     * @param {DoctorDetail|null} action.payload - 医生详情数据或null
     */
    setCurrentDoctor: (state, action: { payload: DoctorDetail | null }) => {
      state.currentDoctor = action.payload;
    },
    
    /**
     * 清空当前医生详情
     * 
     * 功能：清除当前查看的医生信息
     * 
     * @param {DoctorDetailState} state - 当前状态
     */
    clearCurrentDoctor: (state) => {
      state.currentDoctor = null;
    },
    
    /**
     * 清空错误信息
     * 
     * 功能：清除当前错误状态
     * 
     * @param {DoctorDetailState} state - 当前状态
     */
    clearError: (state) => {
      state.error = null;
    },
  },
  extraReducers: (builder) => {
    builder
      // 获取医生详情 - 开始加载
      .addCase(fetchDoctorDetail.pending, (state) => {
        state.loading = true; // 设置加载状态为true
        state.error = null; // 清空错误信息
      })
      // 获取医生详情 - 成功
      .addCase(fetchDoctorDetail.fulfilled, (state, action) => {
        state.loading = false; // 设置加载状态为false
        state.currentDoctor = action.payload; // 设置医生详情数据
      })
      // 获取医生详情 - 失败
      .addCase(fetchDoctorDetail.rejected, (state, action) => {
        state.loading = false; // 设置加载状态为false
        state.error = action.error.message || '获取医生详情失败'; // 设置错误信息
      });
  },
});

/**
 * 导出actions
 * 
 * 供组件使用的action creators
 */
export const { 
  setCurrentDoctor, // 设置当前医生详情
  clearCurrentDoctor, // 清空当前医生详情
  clearError // 清空错误信息
} = doctorDetailSlice.actions;

/**
 * 导出类型定义
 * 
 * 供其他模块使用的TypeScript类型
 */
export type { DoctorDetail };

/**
 * 导出reducer
 * 
 * 供store配置使用的reducer函数
 */
export default doctorDetailSlice.reducer; 